﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace LAPI.Business
{
    /// <summary>
    /// Clase para gestionar la persistencia de datos a lo largo de la sesión del usuario
    /// </summary>
    public class DatosSesion
    {      
        /// <summary>
        /// Modelo del usuario en sesión
        /// </summary>
        private LAPI.Data.Model.Usuario datosUsuario;

        /// <summary>
        /// Permiso del usuario en sesión
        /// </summary>
        private Permisos permiso;

        /// <summary>
        /// En caso que corresponda, el identificador del centro deportivo administrado por el usuario
        /// </summary>
        private Int32 idCentroAdministrado;

        /// <summary>
        /// Constructor
        /// </summary>
        /// <param name="nombreUsuario">Nombre del usuario en sesión</param>
        public DatosSesion(String nombreUsuario)
        {
            Gestores.GestorUsuarios oGest = new Gestores.GestorUsuarios();
            this.datosUsuario = oGest.ObtenerPorNombreUsuario(nombreUsuario: nombreUsuario);
            establecerPermisos(this.datosUsuario);
        }

        /// <summary>
        /// Constructor
        /// </summary>
        /// <param name="datosUsuario">Modelo del usuario con los datos</param>
        public DatosSesion(LAPI.Data.Model.Usuario datosUsuario)
        {            
            this.datosUsuario = datosUsuario;
            establecerPermisos(this.datosUsuario);

            Gestores.GestorUsuarios oGest = new Gestores.GestorUsuarios();
        }

        /// <summary>
        /// Método para renovar el modelo del usuario en sesión, tras un cambio en éste
        /// </summary>
        /// <param name="nuevosDatos">Modelo del usuario con los datos</param>
        public void updateUsuario(LAPI.Data.Model.Usuario nuevosDatos)
        {
            this.datosUsuario.Nombre = nuevosDatos.Nombre;
            this.datosUsuario.Apellido = nuevosDatos.Apellido;
            this.datosUsuario.Apellido2 = nuevosDatos.Apellido2;
            this.datosUsuario.DNI = nuevosDatos.DNI;
            this.datosUsuario.Email = nuevosDatos.Email;     
        }

        /// <summary>
        /// Método para establecer el permiso del usuario en sesión
        /// </summary>
        /// <param name="datos">Modelo del usuario con los datos</param>
        private void establecerPermisos(LAPI.Data.Model.Usuario datos)
        {
            switch (datos.IdPermisos)
            {
                case 2:
                    {
                        permiso = Permisos.ADMINISTRADOR_DE_PISTAS;
                        Gestores.GestorUsuarios gestor = new Gestores.GestorUsuarios();
                        this.idCentroAdministrado = gestor.ObtenerCentroAdministrado(datosUsuario: datos);
                        break;
                    }
                case 3:
                    {
                        permiso = Permisos.ADMINISTRADOR_LAPI;
                        this.idCentroAdministrado = -1;
                        break;
                    }
                default:
                    {
                        permiso = Permisos.USUARIO;
                        this.idCentroAdministrado = -1;
                        break;
                    }
            }
        }

        /// <summary>
        /// Método para obtener el nombre del usuario en sesión
        /// </summary>
        /// <returns></returns>
        public String getNombreUsuario()
        {
            return this.datosUsuario.User;
        }

        /// <summary>
        /// Método para obtener el modelo del usuario en sesión
        /// </summary>
        /// <returns></returns>
        public LAPI.Data.Model.Usuario getModelUsuario()
        {
            return this.datosUsuario;
        }

        /// <summary>
        /// Método para confimar el permiso 'Administrador de sistemas' del usuario en sesión
        /// </summary>
        /// <returns></returns>
        public Boolean EsAdministradorSistema()
        {
            if (permiso == Permisos.ADMINISTRADOR_LAPI)
                return true;
            else
                return false;
        }

        /// <summary>
        /// Método para confimar el permiso 'Administrador de pistas' del usuario en sesión
        /// </summary>
        /// <returns></returns>
        public Boolean EsAdministradorPistas()
        {
            if (permiso == Permisos.ADMINISTRADOR_DE_PISTAS)
                return true;
            else
                return false;
        }

        /// <summary>
        /// Método para confimar el permiso 'usuario' del usuario en sesión
        /// </summary>
        /// <returns></returns>
        public Boolean EsUsuario()
        {
            if (permiso == Permisos.USUARIO)
                return true;
            else
                return false;
        }

        /// <summary>
        /// Método para obtener, en el caso que corresponda, el identificador único del centro deportivo administrado por el usuario en sesión
        /// </summary>
        /// <returns></returns>
        public Int32 getIdCentroDeportivo()
        {
            return idCentroAdministrado;
        }
    }
}
